#include "SequenceInfo.h"

using namespace game_engine::data_format;

///////////////////////////////////////////////////////////////////////////////
// Constructors and Destructors
///////////////////////////////////////////////////////////////////////////////

SequenceInfo::SequenceInfo(void)
    : name()
{
    frames.clear();
}

SequenceInfo::~SequenceInfo(void)
{
}

///////////////////////////////////////////////////////////////////////////////
// Other public methods
///////////////////////////////////////////////////////////////////////////////

void SequenceInfo::parse(xml_node<> *node)
{
    try
    {
        getSequenceName(node);
        buildFramesList(node);
    } catch (exception)
    {
        // TODO
    }
}

///////////////////////////////////////////////////////////////////////////////
// Private methods
///////////////////////////////////////////////////////////////////////////////

void SequenceInfo::getSequenceName(xml_node<> *node)
{
    xml_attribute<> *attr = node->first_attribute("name");
    if (attr != NULL)
    {
        name = attr->value();
    }
    else
    {
        // TODO : throw exception
    }
}

void SequenceInfo::buildFramesList(xml_node<> *node)
{
    // Get frames node
    xml_node<> *nodeFrames = node->first_node("frames");
    if (nodeFrames == NULL)
    {
        // TODO : throw exception
    }

    // Get first frame node
    xml_node<> *nodeFrame = nodeFrames->first_node("frame");

    // Loop through all <frame> nodes
    while (nodeFrame != NULL)
    {
        // Build new frame
        FrameInfo frame;
        try
        {
            frame.parse(nodeFrame);
        } catch (exception) 
        {
        }

        // Add frame to vector
        frames.push_back(frame);

        // Look for next sequence
        nodeFrame = nodeFrame->next_sibling("frame");

    } // while (nodeFrame != NULL)
}

///////////////////////////////////////////////////////////////////////////////
// Getters
///////////////////////////////////////////////////////////////////////////////

const string& SequenceInfo::getName(void) const
{
    return name;
}

const vector<FrameInfo>& SequenceInfo::getFrames(void) const
{
    return frames;
}

///////////////////////////////////////////////////////////////////////////////
// Setters
///////////////////////////////////////////////////////////////////////////////

void SequenceInfo::setName(const string &n)
{
    name = n;
}

void SequenceInfo::setFrames(const vector<FrameInfo> &f)
{
    frames = f;
}
